昨天把Github Action連動好AWS Lambda了,今天來補上Codecov和SonarCloud~
SonarCloud 是一個程式碼品質管理平台,專注於靜態程式碼分析。它的目標是幫助開發團隊發現、追蹤和修復程式碼中的問題。
先去這裡辦好帳號,透過github sso登入sonarcloud,將sonarcloud連動自己的github帳號
接著右上角->My Account->按到Security頁面->打上Token Name->按下Generate
然後打開Github,跟昨天加入AWS Key一樣的方式來把Sonar的Token加入Project的Action secrets
接下來就可以回到SonarCloud,來去連動專案,按下"+" -> Analyze new project -> 找到自己的專案打勾就沒問題了~(要記得把自己的專案必須是公開的,private projects要使用得另外買)
選好自己的專案,就沒問題了~
最後一步,再專案根目錄下開一個名叫sonar-project.properties的檔案,這是一個用來配置 SonarCloud的設定檔,可以參考以下範例使用:
# 指定專案的唯一識別碼。這個值在 SonarCloud 上用來識別不同的專案。
sonar.projectKey=onepiece010938_Line2GoogleDriveBot
# 指定專案所屬的組織(這裡就是自己)
sonar.organization=onepiece010938
# 這是在 SonarCloud UI 中顯示的專案名稱和版本。
sonar.projectName=Line2GoogleDriveBot
sonar.projectVersion=1.0
# 指定要進行程式碼分析的源代碼路徑。這個參數設置為 "." 表示在配置檔所在的目錄中查找源代碼。(在 Windows 上要將 "\" 替換為 "/")
sonar.sources=.
# 指定要排除在程式碼分析之外的檔案或目錄。這些通常是測試檔案、依賴庫或測試數據。
sonar.exclusions=**/*_test.go,**/vendor/**,**/testdata/*
# 指定測試代碼的路徑,這個設置與 sonar.sources 類似,但用於測試代碼。
sonar.tests=.
# 指定要包含在測試分析中的檔案模式。這裡包括所有以 "_test.go" 結尾的檔案。
sonar.test.inclusions=**/*_test.go
# 指定要排除在測試分析之外的檔案或目錄,通常是依賴庫。
sonar.test.exclusions=**/vendor/**
# 指定源代碼的編碼方式,這裡設置為 UTF-8。(默認值是系統的默認編碼方式。)
sonar.sourceEncoding=UTF-8
# 指定測試覆蓋率報告的路徑,報告位於 coverage.out
sonar.go.coverage.reportPaths=coverage.out
# 指定測試報告的路徑。報告位於 report.json
sonar.go.tests.reportPaths=report.json
# 指定 golangci-lint 生成的報告的路徑
sonar.go.golint.reportPaths=golangci-lint.out
Codecov 是一個測試覆蓋率報告工具,它幫助您評估測試的全面性。通過測試覆蓋率,您可以確保您的測試套件足夠涵蓋您的程式碼,並識別需要進一步測試的區域。(by GPT)
Codecov比較簡單,其實跟sonar前面是一樣的步驟,先去這裡連動github然後拿token,再放到secret裡面就好了~
接著回到昨天action的yml檔(aws-lambda.yml),在Go-Test的step後面補上新的step,讓action跟他們連動
- name: Run testing # 運行Go測試,生成測試覆蓋率報告
run: go test -v ./... -race -coverprofile=coverage.out -covermode=atomic -json > report.json
- name: Upload coverage to Codecov # 上傳測試覆蓋率報告到Codecov
uses: codecov/codecov-action@v3
with:
token: ${{ secrets.CODECOV_TOKEN }}
- name: SonarCloud Scan # 執行SonarCloud掃描,用於代碼質量檢查
uses: SonarSource/sonarcloud-github-action@master
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
另外Codecov和SonarCloud都提供很多badges可以放在README上,讓你可以很清楚看到目前專案的狀態,可以參考這邊替換成自己的帳號和專案名稱
[![Build and test Go & Deploy to Lambda](https://github.com/[YOUR_ACCOUNT]/[YOUR_PROJECT_NAME]/actions/workflows/aws-lambda.yml/badge.svg)](https://github.com/[YOUR_ACCOUNT]/[YOUR_PROJECT_NAME]/actions/workflows/aws-lambda.yml)
[![codecov](https://codecov.io/gh/[YOUR_ACCOUNT]/[YOUR_PROJECT_NAME]/branch/main/graph/badge.svg?token=A7U6ZS7OI5)](https://codecov.io/gh/[YOUR_ACCOUNT]/[YOUR_PROJECT_NAME])
[![Technical Debt](https://sonarcloud.io/api/project_badges/measure?project=[YOUR_ACCOUNT]_[YOUR_PROJECT_NAME]&metric=sqale_index)](https://sonarcloud.io/summary/new_code?id=[YOUR_ACCOUNT]_[YOUR_PROJECT_NAME])
[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=[YOUR_ACCOUNT]_[YOUR_PROJECT_NAME]&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=[YOUR_ACCOUNT]_[YOUR_PROJECT_NAME])
[![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=[YOUR_ACCOUNT]_[YOUR_PROJECT_NAME]&metric=reliability_rating)](https://sonarcloud.io/summary/new_code?id=[YOUR_ACCOUNT]_[YOUR_PROJECT_NAME])
[![Duplicated Lines (%)](https://sonarcloud.io/api/project_badges/measure?project=[YOUR_ACCOUNT]_[YOUR_PROJECT_NAME]&metric=duplicated_lines_density)](https://sonarcloud.io/summary/new_code?id=[YOUR_ACCOUNT]_[YOUR_PROJECT_NAME])
[![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=[YOUR_ACCOUNT]_[YOUR_PROJECT_NAME]&metric=vulnerabilities)](https://sonarcloud.io/summary/new_code?id=[YOUR_ACCOUNT]_[YOUR_PROJECT_NAME])
[![Bugs](https://sonarcloud.io/api/project_badges/measure?project=[YOUR_ACCOUNT]_[YOUR_PROJECT_NAME]&metric=bugs)](https://sonarcloud.io/summary/new_code?id=[YOUR_ACCOUNT]_[YOUR_PROJECT_NAME])
[![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=[YOUR_ACCOUNT]_[YOUR_PROJECT_NAME]&metric=security_rating)](https://sonarcloud.io/summary/new_code?id=[YOUR_ACCOUNT]_[YOUR_PROJECT_NAME])
[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=[YOUR_ACCOUNT]_[YOUR_PROJECT_NAME]&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=[YOUR_ACCOUNT]_[YOUR_PROJECT_NAME])
[![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=[YOUR_ACCOUNT]_[YOUR_PROJECT_NAME]&metric=code_smells)](https://sonarcloud.io/summary/new_code?id=[YOUR_ACCOUNT]_[YOUR_PROJECT_NAME])
[![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=[YOUR_ACCOUNT]_[YOUR_PROJECT_NAME]&metric=ncloc)](https://sonarcloud.io/summary/new_code?id=[YOUR_ACCOUNT]_[YOUR_PROJECT_NAME])
效果會像下面這樣
那麼今天就到這邊,讓我們明天再見:)